package JVM;

/**
 * @Author:Cjj
 * JVM 垃圾收集算法
 */
public class jvm3 {
    /**
     * 2.垃圾收集器(GC)清理内存时暂停所有应用程序线程的情况。采用缩写形式STW,来表示Stop-the-World。
     *
     * 2.1 标记-清除算法(Mark-Sweep)
     *      优点：简单，线程安全，不需要锁，不需要复制，不需要分代，不需要引用计数，
     *      不需要压缩，不需要复制，不需要分代，不需要引用计数，不需要压缩，不需要复制，
     *      标记阶段：通过可达性分析遍历堆中弟弟所有对象,标记那些可达的对象
     *      清除阶段：清除所有未被标记的对象。
     *    缺点：标记-清除算法回收的内存区域可能是非连续的,导致内存碎片化。
     * 2.2标记-复制算法(Copying)
     *     将可用内存按照容量划分为大小相同的两块,每次只是用其中的一块。当其中一块用完后,就将还存活的对象复制到另一块,在把
     *     已使用的内存一次性清理掉
     *     优点：非常高效,垃圾回收过程只需要一次标记和复制操作；内存碎片问题被避免,因为回收后的内存是连续的。
     *     缺点：将可用内存缩小为了原来的一般
     * 2.3标记-整理算法(Mark-Compact)
     *     标记阶段：与标记-清除算法相同,通过可达性分析遍历堆中的所有对象,标记那些可达的对象。
     *     整理阶段：标记完成后,整理存活的对象,移动它们到堆的一侧,确实内存空间是连续的。
     *     优点：避免了内存碎片的问题,因为整理阶段将所有存活的对象移到内存的一侧。
     *     缺点：移动对象需要额外的计算和内存拷贝操作,Stop-The-World时间较长。
     *3.分代收集理论
     *     当前商业虚拟机的垃圾收集器,大多数都遵循着"分代收集"的理论进行设计。
     *     弱分带假说：绝大多数对象都是朝生夕灭的。
     *     强分带假说：熬过越多次垃圾收集过程的对象就越难以消亡。
     *
     */

    /**
     * 4.分代垃圾收集
     * 4.1 堆内存的划分
     *  为了遵循分代垃圾收集理论,HotSpot虚拟机将堆内存划分为多个区域,每个区域称为一个代。
     *   1.新生代:
     *     主要存放短生命周期的对象。大多数对象在创建后很快会变得不可达,因此新生代的回收频繁且为
     *     高校。
     *     新生代通常为Eden区和两个Survivor区。
     *       Eden区: 对象在创建时,首先分配在Eden区。
     *       Survivor区: 包含两个区From和To区,其中一个同样最为对象创建的区域,另一个区域用来存放经过新生代
     *       回收后存活下来的对象,两个区交替使用。
     *   2.老年代:
     *      存放生命周期较长的对象或者是大对象。随着对象的生命周期增加,它们会被从新生代移动到老年代。老年代的回收不如新生代频繁,
     *      但回收时间更长。
     *      对象从新生代移到老年代的规则与对象存活的次数(晋升)相关。
     *
     *  4.2分代垃圾回收的命名
     *     1.新生代回收：
     *         Minor GC发生在新生代,当Eden区满时,JVM会进行一次垃圾回收。
     *         在Minor GC时,用户线程暂停,JVM会清理Eden区和Survivor区中不可达的对象,存活下来的对象会被移动到Survivor区,若存活时间
     *         足够长,会被晋升到老年代。
     *         新生代的回收频繁，但由于它的内存较小,回收时所需的时间相对较短。
     *     2.老年代回收：
     *         Major GC发生在老年代,当Eden区满时,JVM会进行一次垃圾回收。
     *         在回收过程中,JVM会尝试清理老年代中的垃圾对象,通常会发生对象的压缩(即将存活对象移动,释放连续的空间)和清理。
     *    3.Full Gc
     *         Full GC是对 整个堆 的回收,包括新生代和老年代,甚至可能会涉及到方法区等其他区域的回收。
     *         Full GC的过程比Major GC更加全面,通常是因为某些条件触发。
     *  5.常见的分代垃圾收集器
     *     JVM提供了多种垃圾回收器,每种回收器有不同的优缺点,同时它们跟上面讲到的垃圾收集算法和理论密切相关
     *     常见的垃圾回收器包括:
     *
     *   5.1 Serial GC:
     *   最古老的一个垃圾收集器,是一个单线程垃圾回收器,适用于单核CPU或低资源环境。(可达性分析和整理内存碎片都会出现STW)
     *   新生代的回收采用标记-复制算法
     *   1.先用可达性分析标记
     *   2.将Eden区和From Survivor区中存活的对象复制到To Survivor区中。如果存活对象年龄达到晋升阈值，则直接晋升到老年代。
     *   3.最后清空Eden区和From Survivor区,然后交换From和To的角色。
     *
     *   相当于是标记-复制算法中内存容量平分,但是这里是Eden+From为一个内存,To为一个内存)
     *   老年代的回收 采用 标记-整理算法。
     *
     *
     */
}
